#ifndef CHATWINDOW_H
#define CHATWINDOW_H

#include <QtGui>

// класс окна чата - наследуем его от класса диаловогого окна, т.к. нужны некоторые
// внешние особенности, которыми обладают только диалоговые окна
class ChatWindow : public QDialog
{
	// макрос, присущий только библиотеке Qt
	// позволяет использовать сигналы/слоты (см. ниже)
	Q_OBJECT

	public:
		// конструктор (в качестве параметра - указатель на виджет, его породивший)
		ChatWindow(QWidget *parent = 0);

		// ник того, с кем общаемся
		QString talker;

		// функция возвращает индикатор того, ушел ли собеседник оффлайн
		bool isDead();

		// слоты класса (функции, вызываемые для задания каких либо параметров в конструкции connect)
		// эти слоты доступны извне, другим классам
	public slots:
		// этот слот задает ник собеседника, передаваемый в качестве параметра
		void setTalker(QString);
		// задает наш ник, он также в качестве параметра передается
		void setAppName(QString);
		// пришло новое сообщение от собеседника
		// функция вызывается из главного класса в случае прихода на извне сообщения, адресованного
		// нашему собеседнику. само сообщение как раз передается в качестве параметра и отображается в чате
		void newMessage(QString);
		// собеседник ушел в оффлайн
		// вызывается из главного класса, когда в следствии проверки "мертвых душ", оказалось, что наш
		// собеседник именно "мертвый"
		// функция "затеняет" строку ввода сообщений
		void setDead(bool);

		// а это переменные вспомогательные для этого класса
	private:
		QString appName;
		// индикатор активности собеседника (онлайн ли он)
		bool dead;

		// область, где отображается чат
		// в виде просто текста, где каждая новая строка - подкрашенное наше сообщение или сообщение нам
		QTextEdit *messages;
		// строка ввода сообщения
		// по нажатию Enter, сообщение посылается
		QLineEdit *messEdit;
		QPushButton *sendButton;

		// слоты только для внутреннего использования
	private slots:
		// послать сообщение
		// эта функция вызывается, когда нажимается Enter в строке messEdit
		// она добавляет новое сообщение в окно чата, и передает это сообщение главному
		// классу для посылки собеседнику вызовом сигнала (см. ниже)
		void sayMessage();

		// сигнал - некая физическая величина, испускаемая в некоторых случаях
		// ей можно передать параметр, который и буде получен принимающей стороной - слотом
	signals:
		// в данном случае - мы сообщаем миру (главному классу) о том, что хотим отправить новое сообщение
		// ловится это основным классом, который разбирает это сообщение (в его начале указывается ник собеседника)
		// и посылет его указанному собеседнику
		void iSayMessage(QString);
};

#endif
